package day20170417.ch01;

public class PetDaoImpl implements PetDao {

	/**
	 * 增加一个宠物
	 * 
	 * @param petShop
	 *            宠物商店
	 * @param pet
	 *            宠物标准
	 * @return 返回结果
	 */
	@Override
	public boolean addPet(PetShop petShop, Pet pet) {
		// 获取笼子的数组
		Pet[] pets = petShop.getPets();
		// 判断是否可以增加新的宠物
		int count = 0;
		for (int index = 0; index < pets.length; index++) {
			// 获得宠物的对象
			Pet petObject = pets[index];
			// 判断笼子是否有对象
			if (petObject != null) {
				// 如果有对象就++
				count++;
			} else {
				// 如果位置有空，代表可以增加新的宠物
				break;
			}
		}

		// 判断笼子是否已经满了
		if (count < pets.length) {
			// 把加入的宠物装到笼子
			pets[count] = pet;
			// 增加成功
			return true;
		} else {
			System.out.println("笼子已满..无法装入");
		}
		// 增加失败
		return false;
	}

	/**
	 * 指定查询宠物
	 * 
	 * @param petShop
	 *            宠物商店
	 * @param petName
	 *            宠物名字
	 * @return 返回结果
	 */
	@Override
	public Pet findPetByName(PetShop petShop, String petName) {
		// 拿到宠物商店中的数组（笼子）
		Pet[] pets = petShop.getPets();
		// 超级for循环进行遍历
		for (Pet pet : pets) {
			// 拿到对象中的名字
			String name = pet.getName();
			// 判断名字是否相同
			if (name.equals(petName)) {
				System.out.println();
				System.out.println("找到了你需要的宠物...");
				// 如果相同返回结果
				return pet;
			}
		}
		// 如果没有返回Null
		return null;
	}

	/**
	 * 根据年龄查询宠物
	 * 
	 * @param petShop
	 *            宠物商店
	 * @param age
	 *            指定年龄
	 * @return 返回的结果
	 */
	@Override
	public Pet[] findPetByAge(PetShop petShop, int age) {
		// 通过宠物商店拿到数组（笼子）
		Pet[] pets = petShop.getPets();
		// 新数组的长度
		int count = 0;
		// 遍历旧数组
		for (Pet pet : pets) {
			// 防止控制住呢
			if (pet != null) {
				// 拿到宠物的年龄
				int petAge = pet.getAge();
				// 如果宠物年龄等于指定年龄
				if (petAge == age) {
					// 新数组的长度+1
					count++;
				}
			}
		}

		// 定义新数组
		Pet[] newPet = new Pet[count];
		// 重新赋值（这次属于新数组的下标）
		count = 0;
		// 遍历旧数组
		for (Pet pet : pets) {
			// 防止控制住呢
			if (pet != null) {
				// 拿到宠物的年龄
				int petAge = pet.getAge();
				// 如果宠物年龄等于指定年龄
				if (petAge == age) {
					// 赋值到新的数组
					newPet[count] = pet;
					// 下标++
					count++;
				}
			}
		}
		// 返回新的数组
		return newPet;
	}

	/**
	 * 批量删除
	 * 
	 * @param petShop
	 *            宠物商店
	 * @param args
	 *            需要删除多个或者1个宠物
	 * @return 返回结果
	 */
	@Override
	public Pet[] deletePet(PetShop petShop, String... args) {
		// 拿到宠物的对象
		Pet[] pets = petShop.getPets();
		// 新数组的长度
		int count = 0;
		// 拿来判断是否有相同的
		boolean result = false;
		// 超级for循环拿到宠物对象
		for (Pet pet : pets) {
			// 防止空指针
			if (pet != null) {
				// 每次进来初始化，否则会变成true
				result = false;
				// 拿到对象中的名字
				String petName = pet.getName();
				// 拿到变长参数中的名字
				for (String name : args) {
					// 判断名字是否相同
					if (name.equals(petName)) {
						// 如果相同result变成true，以便下次继续循环
						result = true;
						// 找到相同的跳出循环
						break;
					}
				}
				// 如果result=false
				if (!result) {
					// 新数组的长度++
					count++;
				}
			}
		}

		// 定义新的数组
		Pet[] newPet = new Pet[count];
		// 新数组赋值的下标
		count = 0;
		// 拿来判断是否有相同的
		for (Pet pet : pets) {
			// 防止空指针
			if (pet != null) {
				// 每次进来初始化，否则会变成true
				result = false;
				// 拿到对象中的名字
				String petName = pet.getName();
				// 拿到变长参数中的名字
				for (String name : args) {
					// 判断名字是否相同
					if (name.equals(petName)) {
						// 如果相同result变成true，以便下次继续循环
						result = true;
						// 找到相同的跳出循环
						break;
					}
				}
				// 如果result=false
				if (!result) {
					// 把对象装进数组
					newPet[count] = pet;
					// count++，如果不++否则下个会把前面一个覆盖
					count++;
				}
			}
		}
		// 返回新数组
		return newPet;
	}

	/**
	 * 修改宠物
	 * 
	 * @param petShop
	 *            宠物商店
	 * @param petName
	 *            宠物名字
	 * @return 返回对象
	 */
	@Override
	public Pet updatePet(PetShop petShop, String petName, int age) {
		// 拿到数组（笼子）
		Pet[] pets = petShop.getPets();
		// 遍历数组，拿到宠物对象
		for (Pet pet : pets) {
			// 防止空指针
			if (pet != null) {
				// 拿到对象中的名字
				String name = pet.getName();
				// 如果需要修改的名字和对象中的名字相同
				if (name.equals(petName)) {
					// 修改年龄
					pet.setAge(age);
					// 修改完成返回对象
					return pet;
				}
			}
		}
		// 不存在返回null
		return null;
	}

	/**
	 * 修改（一统天下）
	 * 
	 * @param petShop	宠物商店
	 * @param before	修改条件
	 * @param after 	修改完成后的对象
	 * @return 			返回结果
	 */
	public Pet[] updateAllPet(PetShop petShop, Pet before, Pet after) {

		// 拿到数组（笼子）
		Pet[] pets = petShop.getPets();

		// 分别拿到条件的值
		String name = before.getName();
		String color = before.getColor();
		int age = before.getAge();
		
		int count = 0;

		if(name != null || color != null || age != 0){
			// 名字等于null
			if (name == null) {
				for (Pet pet : pets) {
					// 防止空指针，因为数组里面也有可能是Null
					if (pet != null) {
						count = petColorAndAge(color, age, count, pet);
					}
				}
			}else{
				for (Pet pet : pets) {
					// 防止空指针，因为数组里面也有可能是Null
					if (pet != null) {
						String oldName = pet.getName();
						if(name.equals(oldName)){
							count = petColorAndAge(color, age, count, pet);
						}
					}
				}
			}
		}
		
		Pet[] newArrays = new Pet[count];
		count = 0;
		
		
		if(name != null || color != null || age != 0){
			// 名字等于null
			if (name == null) {
				for (Pet pet : pets) {
					// 防止空指针，因为数组里面也有可能是Null
					if (pet != null) {
						count = petUpdateArrays(color, name,age, count, pet, newArrays);
					}
				}
			}else{
				for (Pet pet : pets) {
					// 防止空指针，因为数组里面也有可能是Null
					if (pet != null) {
						String oldName = pet.getName();
						if(name.equals(oldName)){
							count = petUpdateArrays(color, name,age, count, pet, newArrays);
						}
					}
				}
			}
		}
		
		return newArrays;
	}
	
	/**
	 * 修改
	 * @param color
	 * @param name
	 * @param age
	 * @param count
	 * @param pet
	 * @param newArrays
	 * @return
	 */
	private int petUpdateArrays(String color,String name, int age, int count, Pet pet,Pet[] newArrays) {
		// 颜色不等于空
		if (color != null) {
			// 拿到颜色
			String oldColor = pet.getColor();
			// 判断颜色是否相等
			if (color.equals(oldColor)) {
				// 年龄是否部位0
				if (age > 0) {
					// 拿到对象中的年龄
					int oldAge = pet.getAge();
					// 判断年龄是否相同
					if (age == oldAge) {
						// 名字null，颜色相同，年龄相同
						count++;
					}
				} else {
					// 名字null，颜色相同，年龄为0
					count++;
				}
			}
		} else {
			// 年龄是否部位0
			if (age > 0) {
				// 拿到对象中的年龄
				int oldAge = pet.getAge();
				// 判断年龄是否相同
				if (age == oldAge) {
					// 名字null，颜色相同，年龄相同
					count++;
				}
			} else {
				count++;
			}
		}
		return count;
	}
	
	/**
	 * 查找
	 * @param color
	 * @param age
	 * @param count
	 * @param pet
	 * @return
	 */
	private int petColorAndAge(String color, int age, int count, Pet pet) {
		// 颜色不等于空
		if (color != null) {
			// 拿到颜色
			String oldColor = pet.getColor();
			// 判断颜色是否相等
			if (color.equals(oldColor)) {
				// 年龄是否部位0
				if (age > 0) {
					// 拿到对象中的年龄
					int oldAge = pet.getAge();
					// 判断年龄是否相同
					if (age == oldAge) {
						// 名字null，颜色相同，年龄相同
						count++;
					}
				} else {
					// 名字null，颜色相同，年龄为0
					count++;
				}
			}
		} else {
			// 年龄是否部位0
			if (age > 0) {
				// 拿到对象中的年龄
				int oldAge = pet.getAge();
				// 判断年龄是否相同
				if (age == oldAge) {
					// 名字null，颜色相同，年龄相同
					count++;
				}
			} else {
				count++;
			}
		}
		return count;
	}
}
